package mysql8学习.高级.第18章_主从复制;

/**
 * 格式1: STATEMENT模式
 * (基于SQL语句的复制(statement-based replication, SBR)
 *  binlog_format=STATEMENT
 * 每一条会修改数据的sql语句会记录到binlog中。这是默认的binlog格式。
 * ● SBR 的优点:
 *    。历史悠久，技术成熟
 *    。不需要记录每一行的变化，减少了binlog日志量，文件较小
 *    。binlog中包含了所有数据库更改信息，可以据此来审核数据库的安全等情况
 *    。binlog可以用于实时的还原，而不仅仅用于复制
 *    。主从版本可以不一样，从服务器版本可以比主服务器版本高
 * ● SBR的缺点:
 *    。不是所有的UPDATE语句都能被复制，尤其是包含不确定操作的时候
 * ● 使用以下函数的语句也无法被复制:
 *   LOAD_FILE0、 UUID()、USER()、 FOUND_ROWS()、SYSDATE()
 *   (除非启动时启用了--sysdate-is-now选项)
 *  。INSERT ... SELECT会产生比RBR更多的行级锁
 *  。复制需要进行全表扫描(WHERE语句中没有使用到索引的UPDATE时,需要比RBR请求更多的行级锁
 *  。对于有AUTO_JINCREMENT字段的InnoDB表而言，INSERT语句会阻塞其他INSERT语句
 *  。对于一些复杂的语句，在从服务器上的耗资源情况会更严重，而RBR模式下，
 *    只会对那个发生变化的记录产生影响
 *  。执行复杂语句如果出错的话，会消耗更多资源
 *  。数据表必须几乎和主服务器保持一致才行，否则可能会导致复制出错
 *
 * ② ROW模式
 *  (基于行的复制(row-based replication, RBR))
 *  binlog_format=RON
 * 5.1.5版本的MySQL才开始支持，不记录每条sql语句的上下文信息，
 *   仅记录哪条数据被修改了修改成什么样了。
 *
 * ●RBR 的优点:
 *   。任何情况都可以被复制，这对复制来说是最安全可靠的。
 *     (比如: 不会出现某些特定情况下的存储过程、function. trigger的调用和触发无法被正确复制的问题)
 *   。多数情况下，从服务器上的表如果有主键的话，复制就会快了很多
 *   。复制以下几种语句时的行锁更少: INSERT .. SELECT
 *     包含AUTO_INCREMENT字段的INSERT.
 *     没有附带条件或者并没有修改很多记录的UPDATE或DELETE语句
 *   。执行 INSERT, UPDATE， DELETE 语句时锁更少
 *   。从服务器上采用 多线程 来执行复制成为可能
 * ●RBR的缺点:
 *   。binlog大了很多
 *   。复杂的回滚时binlog中会包含大量的数据
 *   。主服务器.上执行UPDATE语句时，所有发生变化的记录都会写到binlog中，
 *     而SBR只会写一次，这会导致频繁发生binlog的并发写问题
 *   。无法从binlog中看到都复制了些什么语句
 *
 * ③ MIXED 模式
 *  (混合模式复制(mixed-based replication, MBR)
 *  binlog_format=MIXED
 *  从5.1.8版本开始，MySQL提供了 MIXED 格式，实际上就是Statement与Row的结合。
 *
 *  在Mixed模式下，一般的语句修改使用 statement格式保存binlog,
 *  如一些函数，statement无法完成主从复制的操作,则采用row格式保存binlog.
 *
 *  MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式，
 *  也就是在Statement和Row之间选择一种。
 *
 */
public class C2_拓展_binlog格式设置 {

}
